package modelo.servicio;

import controlador.SeccionControlador;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import modelo.bd.dao.ReporteDAO;
import modelo.bd.excepcion.DAOException;

public class Reportes {

    private static Reportes instancia;
    private ReporteDAO dao;

    public static Reportes instancia() {
        if (instancia == null) {
            instancia = new Reportes();
        }
        return instancia;
    }
    //private String nombreReporte;

    private Reportes() {
        this.dao = new ReporteDAO();
    }

    public List<String[]> generarReporte(Integer area, String tipo, String fechaInicio, String fechaFin) 
            throws DAOException {
        List<String[]> reporte = dao.selectReportes(area, tipo, fechaInicio, fechaFin);
        try {
            String nombreReporte = "RP_" + area + "_" + tipo + ".xls";
            File repLocal = new File(SeccionControlador.getDirectorioTemporal() + nombreReporte);
            WritableWorkbook workbook = Workbook.createWorkbook(repLocal);
            WritableSheet sheet = workbook.createSheet("Reporte", 0);
            for (int i = 0; i < reporte.size(); i++) {
                String[] registro = reporte.get(i);
                for (int j = 0; j < registro.length; j++) {
                    Label label = new Label(j, i, registro[j]);
                    sheet.addCell(label);
                }
            }
            workbook.write();
            workbook.close();

            //------------- TEST
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(SeccionControlador.getUsuarioCIFS());
            String path = "smb:" + SeccionControlador.getDirectorioCarga().replace("\\", "/") + nombreReporte;
            SmbFile ruta = new SmbFile(("smb:" + SeccionControlador.getDirectorioCarga()).replace("\\", "/"), auth);
            if (!ruta.exists()) {
                ruta.mkdir();
            }
            SmbFile sFile = new SmbFile(path, auth);
            SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);

            File file = new File(SeccionControlador.getDirectorioTemporal() + nombreReporte);
            byte[] rep = new byte[(int) file.length()];
            FileInputStream fileInputStream = new FileInputStream(file);
            fileInputStream.read(rep);

            sfos.write(rep);

            fileInputStream.close();
            sfos.close();
            //-------------
            repLocal.delete();
        } catch (Exception ex) {
            throw new DAOException("Error al generar XLS del reporte " + ex.getMessage());
        } finally {
            return reporte;
        }
    }

    public List<String[]> obtenerTiposReporte() throws DAOException {
        return dao.selectTiposReporte();
    }
}
